package gm.commands;

import com.martiansoftware.jsap.JSAP;
import com.martiansoftware.jsap.JSAPResult;
import java.io.PrintWriter;

/**
 * Parancs.
 *
 * @author imruf84
 */
public class Command extends JSAP {

    /**
     * Parancs neve.
     */
    private final String name;
    /**
     * Parancsot végrehajtó esemény.
     */
    private final RunnableCommand event;

    /**
     * Konstruktor.
     *
     * @param name parancs neve
     * @param event parancsot végrehajtó esemény
     */
    public Command(String name, RunnableCommand event) {
        this.name = name;
        this.event = event;
    }

    /**
     * Parancs végrehajtása.
     *
     * @param command parancs szövege
     * @param out kimenet
     * @return végeredmény szövege
     */
    public String execute(String command, final PrintWriter out) {

        // Az első paraméter a parancs neve, amit tévesen paraméternek értelmez az értelmező, ezért kiszedem).
        String shortCommand = command.replaceFirst(getName(), "").trim();

        // Segítség küldése.
        if (shortCommand.toLowerCase().startsWith("--help") || shortCommand.toLowerCase().startsWith("?")) {
            return getUsageAsString();
        }

        // Parancs értelmezése.
        JSAPResult result = parse(shortCommand);

        // Hiba esetén kilépünk a megfelelő üzenettel.
        if (!result.success()) {
            String s = "";
            for (java.util.Iterator errs = result.getErrorMessageIterator();
                    errs.hasNext();) {
                s += ("Error: " + errs.next());
            }
            return s + "\n" + getUsageAsString();
        }

        // Egyébként mehet a munka.
        return event.execute(this, command, result, out);
    }

    /**
     * Parancs használatának lekérdezése szövegként.
     *
     * @return használat szövege
     */
    private String getUsageAsString() {
        return "Usage:\n" + getName() + " " + getUsage() + "\n" + getHelp();
    }

    /**
     * Név lekérdezése.
     *
     * @return név
     */
    public String getName() {
        return name;
    }
}
